package org.glut.cloud.repairRecordManage.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.glut.cloud.repairRecordManage.config.WenXinConfig;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@Slf4j
@RequestMapping("/test")
public class TestController {

    @Resource
    private WenXinConfig wenXinConfig;

    // 历史对话记录，需要按照 user, assistant 的顺序保存
    List<Map<String,String>> messages = new ArrayList<>();

    /**
     * 非流式问答接口
     * @param question 用户的问题
     * @return 响应的结果字符串
     * @throws IOException 如果网络请求出现错误
     */
    @PostMapping("/ask")
    public String test1(String question) {
        if(question == null || question.equals("")){
            return "请输入问题"; // 如果问题为空，返回提示信息
        }

        String responseJson = null;
        try {
            // 刷新 Access Token
            if (wenXinConfig.flushAccessToken() != null) {
                // 将用户问题加入历史对话记录
                HashMap<String, String> user = new HashMap<>();
                user.put("role", "user");
                user.put("content", question);
                messages.add(user);

                // 构造请求的 JSON 数据
                String requestJson = constructRequestJson(1, 0.95, 0.8, 1.0, false, messages);
                RequestBody body = RequestBody.create(MediaType.parse("application/json"), requestJson);

                // 创建 HTTP 请求
                Request request = new Request.Builder()
                        .url(wenXinConfig.ERNIE_Bot_4_0_URL + "?access_token=" + wenXinConfig.flushAccessToken())
                        .method("POST", body)
                        .addHeader("Content-Type", "application/json")
                        .build();

                // 执行 HTTP 请求
                OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();
                Response response = HTTP_CLIENT.newCall(request).execute();

                // 处理 HTTP 响应
                if (!response.isSuccessful()) {
                    log.error("请求失败: 状态码 " + response.code());
                    return "请求失败: 状态码 " + response.code();
                }

                responseJson = response.body().string();
                JSONObject responseObject = JSON.parseObject(responseJson);

                // 将助手的回答加入历史对话记录
                HashMap<String, String> assistant = new HashMap<>();
                assistant.put("role", "assistant");
                assistant.put("content", responseObject.getString("result"));
                messages.add(assistant);

            } else {
                return "无法获取 Access Token"; // 如果获取 Access Token 失败，返回提示信息
            }
        } catch (IOException e) {
            log.error("网络异常: " + e.getMessage());
            return "网络异常: " + e.getMessage(); // 处理网络异常并返回错误信息
        }

        return responseJson; // 返回响应的 JSON 数据
    }

    /**
     * 构造请求的 JSON 数据
     * @param userId 用户 ID
     * @param temperature 温度参数，控制生成文本的随机性
     * @param topP Top-p 采样参数
     * @param penaltyScore 惩罚分数，控制重复惩罚
     * @param stream 是否开启流式输出
     * @param messages 历史对话记录
     * @return 构造好的请求 JSON 字符串
     */
    public String constructRequestJson(Integer userId,
                                       Double temperature,
                                       Double topP,
                                       Double penaltyScore,
                                       boolean stream,
                                       List<Map<String, String>> messages) {
        // 构造请求参数的 Map
        Map<String,Object> request = new HashMap<>();
        request.put("user_id", userId.toString());
        request.put("temperature", temperature);
        request.put("top_p", topP);
        request.put("penalty_score", penaltyScore);
        request.put("stream", stream);
        request.put("messages", messages);

        System.out.println(JSON.toJSONString(request)); // 输出请求 JSON 字符串以便调试
        return JSON.toJSONString(request); // 将请求参数转换为 JSON 字符串并返回
    }
}
